/**
 * 主要思想： inheritPrototype 函数接收两个参数：子类型构造函数和超类型构造函数。
 *          在函数内部，第一步是创建超类型原型的一个副本
 *          第二步，为创建的副本添加 constructor 属性
 *          第三步，将新创建的对象（即副本）赋值给子类型的原型
 * 
 * 优点：
 *      1. 弥补了组合继承的两次调用缺陷，因此避免了在 SubType.prototype 上创建不必要、多余的属性。与此同时，原型链还能保持不变；
 *         因此，还能够正常地使用 instanceof 和 isPrototypeOf() 
 *         开发人员普遍认为寄生组合式继承是引用类型最理想的继承范式
 */

function object (o) {
  function F() {}
  F.prototype = o
  return new F()
}

function inheritPrototype (subType, superType) {
  let prototype = object(superType.prototype)   //  创建对象
  prototype.constructor = subType   //  增强对象
  subType.prototype = prototype   //  指定对象
}

function SuperType (name) {
  this.name = name
  this.colors = ['green', 'blue']
}

function SubType (name, age) {
  SuperType.call(this, name)
  this.age = age
}

inheritPrototype(SubType, SuperType)

